package com.zenithmind.common.docs;

import com.zenithmind.common.annotation.DataCache;
import com.zenithmind.common.annotation.DataCacheEvict;

/**
 * 缓存注解使用示例
 * 本类仅作为文档参考，不实际运行
 */
public class CacheUsageExample {

    /**
     * 1. 基础缓存使用示例
     * 使用@DataCache注解自动处理缓存
     * 方法执行前会先查询缓存，如果缓存中存在则直接返回缓存结果
     * 方法执行后会自动将结果存入缓存
     */
    @DataCache(prefix = "user", key = "#id")
    public Object findById(String id) {
        // 从数据库查询数据
        return null; // 实际返回查询结果
    }

    /**
     * 2. 自定义过期时间
     * 可以设置缓存的过期时间和时间单位
     */
    @DataCache(prefix = "product", key = "#id", expireTime = 30, timeUnit = java.util.concurrent.TimeUnit.MINUTES)
    public Object findProductById(String id) {
        // 从数据库查询数据
        return null;
    }

    /**
     * 3. 复杂缓存键示例
     * 可以使用SpEL表达式构建复杂的缓存键
     */
    @DataCache(prefix = "user", key = "#user.id + ':' + #user.username")
    public Object findUserDetails(UserObject user) {
        // 从数据库查询数据
        return null;
    }

    /**
     * 4. 清除缓存示例
     * 使用@DataCacheEvict注解自动清除缓存
     * 方法执行后会自动清除指定的缓存
     */
    @DataCacheEvict(prefix = "user", key = "#user.id")
    public void updateUser(UserObject user) {
        // 更新数据库
    }

    /**
     * 5. 方法执行前清除缓存
     * 设置beforeInvocation=true，可以在方法执行前清除缓存
     */
    @DataCacheEvict(prefix = "user", key = "#id", beforeInvocation = true)
    public void deleteUser(String id) {
        // 删除数据库记录
    }

    /**
     * 6. 清除所有缓存
     * 设置allEntries=true，可以清除指定前缀的所有缓存
     */
    @DataCacheEvict(prefix = "user", allEntries = true)
    public void refreshAllUsers() {
        // 刷新所有用户数据
    }

    /**
     * 7. 禁用布隆过滤器
     * 设置useBloomFilter=false，可以禁用布隆过滤器
     */
    @DataCache(prefix = "temp", key = "#id", useBloomFilter = false)
    public Object findTempData(String id) {
        // 查询临时数据
        return null;
    }

    /**
     * 8. 禁用分布式锁
     * 设置useLock=false，可以禁用分布式锁
     * 不适用于高并发场景，可能导致缓存击穿
     */
    @DataCache(prefix = "low-concurrency", key = "#id", useLock = false)
    public Object findLowConcurrencyData(String id) {
        // 查询低并发数据
        return null;
    }

    /**
     * 用于示例的假用户对象
     */
    public static class UserObject {
        private String id;
        private String username;

        public String getId() {
            return id;
        }

        public String getUsername() {
            return username;
        }
    }
} 